package models;

import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import play.db.DB;


public abstract class Usuario {
	
	private int codigo;
	private String nome;
    private Date dataNascimento;
    private int naipe;
    private String telefone;
    private String endereco;
    private String email;
    private String login;
    private String senha;

    public int getTipo() {
    	// Tipo do Usuario: CORALISTA, REGENTE, SECRETARIO
    	int tipo = 0;	// Coralista
    	if(this instanceof Secretario) {
    		tipo = 1;
    	}
    	else if(this instanceof Regente) {
    		tipo = 2;
    	}
    	
    	return tipo;
    }
    
    public static Usuario isValid(String usuario, String senha) throws SQLException {
    	ResultSet rs = DB.executeQuery("SELECT * FROM usuario WHERE nome_usuario = '"
    			+ usuario + "' AND senha = '" + senha + "'");
    	
    	if (rs.next()){
    		int tipo = rs.getInt(2);
    		Usuario user;
    		if(tipo == 0)
    			user = new Coralista(rs.getInt(1), rs.getString(3), rs.getDate(4), 
    				rs.getInt(5), rs.getString(6), rs.getString(7), rs.getString(8),
    				rs.getString(9), rs.getString(10));
    		else if(tipo == 1)
    			user = new Secretario(rs.getInt(1), rs.getString(3), rs.getDate(4), 
        				rs.getInt(5), rs.getString(6), rs.getString(7), rs.getString(8),
        				rs.getString(9), rs.getString(10));
    		else
    			user = new Regente(rs.getInt(1), rs.getString(3), rs.getDate(4), 
        				rs.getInt(5), rs.getString(6), rs.getString(7), rs.getString(8),
        				rs.getString(9), rs.getString(10));
    		return user;
    	}
    	else return null;
    }
    
    public static List<Usuario> all() throws SQLException {
    	ResultSet rs = DB.executeQuery("SELECT * FROM usuario");
    	
    	List<Usuario> lista = new ArrayList<Usuario>();
    	
    	while(rs.next()) {
    		int tipo = rs.getInt(2);
    		Usuario usuario;
    		
    		if(tipo == 0)
    			usuario = new Coralista(rs.getInt(1), rs.getString(3), rs.getDate(4), 
    				rs.getInt(5), rs.getString(6), rs.getString(7), rs.getString(8),
    				rs.getString(9), rs.getString(10));
    		else if(tipo == 1)
    			usuario = new Secretario(rs.getInt(1), rs.getString(3), rs.getDate(4), 
        				rs.getInt(5), rs.getString(6), rs.getString(7), rs.getString(8),
        				rs.getString(9), rs.getString(10));
    		else
    			usuario = new Regente(rs.getInt(1), rs.getString(3), rs.getDate(4), 
        				rs.getInt(5), rs.getString(6), rs.getString(7), rs.getString(8),
        				rs.getString(9), rs.getString(10));
    		
    		lista.add(usuario);
    	}
    	
    	return lista;
    }
    
    /**
     * Inserts the Usuario object in the DB
     */
    public void save() throws SQLException {
    	// executeQuery para pegar o MAX de codigo
    	if(this.codigo == -1) {
    		ResultSet rs = DB.executeQuery("SELECT max(codigo) FROM usuario");
    		rs.next();
    		
    		this.codigo = rs.getInt(1) + 1;
    	}
    	
    	// Tipo do Usuario: CORALISTA, REGENTE, SECRETARIO
    	int tipo = getTipo();
    	
    	DB.execute("INSERT INTO Usuario(codigo, tipo, nome, data_nascimento, naipe, telefone,"
    			+ " endereco, email, nome_usuario, senha) VALUES("
    			+ "'" + Integer.toString(this.codigo) + "',"
    			+ "'" + Integer.toString(tipo) + "',"
    			+ "'" + this.nome + "',"
    			+ "'" + this.dataNascimento.toString() + "',"
    			+ "'" + Integer.toString(this.naipe) + "',"
    			+ "'" + this.telefone + "',"
    			+ "'" + this.endereco + "',"
    			+ "'" + this.email + "',"
    			+ "'" + this.login + "',"
    			+ "'" + this.senha + "'"
    			+ ")");
    }
    
	/**
	 * @param codigo the codigo to set
	 */
	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}

	/**
	 * @return the codigo
	 */
	public int getCodigo() {
		return codigo;
	}
    
    /**
     * @return the nome
     */
    public String getNome() {
        return nome;
    }

    /**
     * @param nome the nome to set
     */
    public void setNome(String nome) {
        this.nome = nome;
    }

    /**
     * @return the nascimento
     */
    public Date getDataNascimento() {
        return dataNascimento;
    }

    /**
     * @param nascimento the nascimento to set
     */
    public void setDataNascimento(Date nascimento) {
        this.dataNascimento = nascimento;
    }

    /**
     * @return the naipe
     */
    public int getNaipe() {
        return naipe;
    }
    
    /**
     * @return the naipe in a string format
     */
    public String getNaipeString() {
    	switch(naipe) {
    	case 0: return "Soprano";
    	case 1: return "Contralto";
    	case 2: return "Tenor";
    	case 3: return "Baixo";
    	}
    	
    	return "";
    }

    /**
     * @param naipe the naipe to set
     */
    public void setNaipe(int naipe) {
        this.naipe = naipe;
    }
    
    /**
     * @param naipe the naipe in a string format to set
     */
    public int setNaipeString(String naipe) {
    	if(naipe.compareTo("Soprano") == 0) return 0;
    	else if(naipe.compareTo("Contralto") == 0) return 1;
    	else if(naipe.compareTo("Tenor") == 0) return 2;
    	else if(naipe.compareTo("Baixo") == 0) return 3;
    	    	
    	return -1;
    }

    /**
     * @return the telefone
     */
    public String getTelefone() {
        return telefone;
    }

    /**
     * @param telefone the telefone to set
     */
    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }

    /**
     * @return the endereco
     */
    public String getEndereco() {
        return endereco;
    }

    /**
     * @param endereco the endereco to set
     */
    public void setEndereco(String endereco) {
        this.endereco = endereco;
    }

    /**
     * @return the email
     */
    public String getEmail() {
        return email;
    }

    /**
     * @param email the email to set
     */
    public void setEmail(String email) {
        this.email = email;
    }

    /**
     * @return the login
     */
    public String getLogin() {
        return login;
    }

    /**
     * @param login the login to set
     */
    public void setLogin(String login) {
        this.login = login;
    }

    /**
     * @return the senha
     */
    public String getSenha() {
        return senha;
    }

    /**
     * @param senha the senha to set
     */
    public void setSenha(String senha) {
        this.senha = senha;
    }
    
    public static void delete(int codigoUsuario) {
    	DB.execute("DELETE FROM usuario WHERE codigo = '" + codigoUsuario + "'");
    }
}
